/*
    功能：在一个二维矩阵中寻找所有满足“n×n 区域之和 ≥ powerReq”的子矩阵数量
*/

#include <stdio.h>      // 提供输入输出函数，如 scanf、printf
#include <stdlib.h>     // 提供通用工具函数，如 abs、malloc
#include <string.h>     // 提供字符串处理函数，如 memset、strcpy 等

#define MAX 100         // 矩阵最大尺寸

// step 1# 定义全局变量
int grid[MAX][MAX];     // 输入矩阵，表示能量值
int count = 0;          // 满足条件的 n×n 区域数量

// step 2# 计算以 (i,j) 为左上角的 n×n 区域内的元素和
int getSurroundSum(int i, int j, int n) {
    int sum = 0;                        // 当前区域内能量总和
    int countK = n;
    for (int k = i; countK; countK--, k++) {
        int countL = n;                // 每行重置列计数器
        for (int l = j; countL; countL--, l++) {
            sum += grid[k][l];         // 累加当前元素值
        }
    }
    return sum;                        // 返回该区域的能量和
}

int main() {
    // step 3# 定义变量：行列尺寸、区域边长、最低能量要求
    int row, col, n, powerReq;
    scanf("%d%d%d%d", &row, &col, &n, &powerReq);  // 输入矩阵大小、区域大小和能量要求

    // step 4# 输入整个矩阵
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            scanf("%d", &grid[i][j]);             // 读取每个单元格的能量值
        }
    }

    // step 5# 枚举所有可能的 n×n 区域左上角坐标
    for (int i = 0; i <= row - n; i++) {
        for (int j = 0; j <= col - n; j++) {
            int curPowSum = getSurroundSum(i, j, n);  // 计算当前区域的能量总和

            // step 6# 若满足能量要求，则计数 +1
            if (curPowSum >= powerReq) {
                count++;
            }
        }
    }

    // step 7# 输出结果：满足条件的区域数量
    printf("%d\n", count);

    return 0;
}
